package com.example.d4_proxy;

import java.lang.reflect.Proxy;

public class ProxyUtil {
    public static Star createProxy(BigStar bigStar) {
        /**
         * 参数一：用于执行哪个类加载器去加载生成的代理类
         * 参数二：用于指定代理类需要实现的接口：明星类实现了哪些接口，代理类就实现哪些接口
         * 参数三：用于指定代理类需要如何去代理（代理要做的事情）
         */
        Star starProxy = (Star) Proxy.newProxyInstance(ProxyUtil.class.getClassLoader(), new Class[]{Star.class},
                (proxy, method, args) -> {
                    // 用来声明代理对象要干的事情
                    // 参数一：proxy接收到代理对象本身(暂时用处不大)
                    // 参数二：method代表正在被代理的方法
                    // 参数三：args代表正在被代理的方法的参数
                    String methodName = method.getName(); // 获取方法名称

                    // 代理干的活
                    if ("sing".equals(methodName)) {
                        System.out.println("准备话筒，收钱20万");
                    } else if ("dance".equals(methodName)) {
                        System.out.println("准备场地，收钱100万");
                    }

                    // 真正干活(把真正的明星对象叫过来正式干活)
                    // 找真正的明星对象来执行被代理的方法：method方法
                    return method.invoke(bigStar, args);
                });
        return starProxy;
    }
}
